package com.suisui.util;

import org.apache.commons.codec.DecoderException;
import org.apache.commons.codec.binary.Hex;

import java.util.Arrays;

public class HexUtils {
    /**
     * 把字节数组转为16进制字符串，如果一个字节转为16进制字符后不足两位，前面补0
     * toHexString：把字节(转化为int)之后以16进制的方式显示
     * &作为位运算时，1&1=1 ，1&0=0，0&0=0
     * 0xff 0x表示十六进制，ff是两个十六进制的数，每个f用二进制表示1111，两个f占八位，即一个字节
     *首先toHexString传的参数应该是int类型32位，此处传的是byte类型8位，所以前面需要补24个0。然后& 0xff 就是把前面24个0去掉只要后8位。
     * toHexString(b & 0xff)相当于做了一次位的与运算，将前24位字符省略，将后8位保留。即只转了后8位。即可得到两个十六进制的值
     */
    public static String convertBytes2HexStr(byte[] digestBytes) {
        StringBuilder sb = new StringBuilder();
        for (byte b : digestBytes) {
            //获取b的补码的后八位
            String hex = Integer.toHexString((int)b & 0xff);
            //15的转换结果 --f=>0f
            if(hex.length() == 1){
                hex ="0"+hex;
            }
            sb.append(hex);
        }
        return sb.toString();
    }

    /**
     *把16进制字符串(偶数位)转换为字符数组，
     */
    public static byte[] convertHex2Bytes(String hexStr){
        //16进制是两个二进制位
        //一个字节(8个二进制位)可以转为2个16进制的字符串
        int length = hexStr.length()/2;
        byte[] result = new byte[length];
        for (int i = 0; i < length; i++) {
            //hexStr：abcd
            //Integer.parseInt：把s转为10进制数，radix指定s是什么进制的数
            //获取每个字节的高4位 i=1 (2,3)--c转为16进制
            int high4 = Integer.parseInt(hexStr.substring(i*2,i*2+1),16);
            //获取每个字节的低4位 (3,4)--d
            int low4 = Integer.parseInt(hexStr.substring(i * 2 + 1, i * 2 + 2), 16);
            //高四位*2^4，+低四位
            result[i] =(byte)(high4*16 +low4);
        }
        return result;

    }
    public static void main(String[] args) throws DecoderException {
//        System.out.println(Integer.toHexString(15 & 0xff )); //0f
//        System.out.println(Integer.toHexString(16 & 0xff )); //10
        byte[] bytes = new byte[1];
        bytes[0] = 15;
        System.out.println(convertBytes2HexStr(bytes));
        //使用codec的方法代替自己编写的convertBytes2Hex方法
        System.out.println(Hex.encodeHexString(bytes));

        String hexStr = "abcd";
        System.out.println(Arrays.toString(convertHex2Bytes(hexStr)));
        //codec中方法
        System.out.println(Arrays.toString(Hex.decodeHex(hexStr)));
    }
}
